from apps.databasetest.models import DatabaseConfig  # 导入DatabaseConfig模型（根据实际路径调整）
from django.utils import timezone


class DBconfigService:
    """数据库配置相关业务服务类"""

    @staticmethod
    def get_all_database_configs(query_params):
        """
        查询数据库配置信息（根据参数条件过滤）

        返回：
            list: 包含符合条件的DatabaseConfig实例的列表，每个实例为字典格式
        """
        # 基础查询集，支持排序，按创建时间升序
        configs = DatabaseConfig.objects.all().order_by('create_datetime')
        print(configs)

        # 处理organid查询逻辑（保持不变，假设这里有特定逻辑）
        # 示例：如果有organ_id参数则过滤，否则保持原逻辑
        if 'organ_id' in query_params and query_params['organ_id']:
            configs = configs.filter(organ_id=query_params['organ_id'])

        # 处理其他参数过滤
        # db_name过滤
        if 'db_name' in query_params and query_params['db_name']:
            configs = configs.filter(db_name__icontains=query_params['db_name'])

        # db_alias过滤
        if 'db_alias' in query_params and query_params['db_alias']:
            configs = configs.filter(db_alias__icontains=query_params['db_alias'])

        # host过滤
        if 'host' in query_params and query_params['host']:
            configs = configs.filter(host__icontains=query_params['host'])

        # db_type过滤（精确匹配）
        if 'db_type' in query_params and query_params['db_type']:
            configs = configs.filter(db_type=query_params['db_type'])

        # is_active过滤（转换为布尔值）
        if 'is_active' in query_params and query_params['is_active']:
            # 假设参数值为'1'或'true'表示激活，其他表示未激活
            is_active = query_params['is_active'].lower() in ('1', 'true')
            configs = configs.filter(is_active=is_active)

        # 更新时间范围过滤
        if 'update_start_time' in query_params and query_params['update_start_time']:
            configs = configs.filter(update_datetime__gte=query_params['update_start_time'])

        if 'update_end_time' in query_params and query_params['update_end_time']:
            configs = configs.filter(update_datetime__lte=query_params['update_end_time'])

        # 分页处理
        try:
            page = int(query_params.get('page', 1))
            limit = int(query_params.get('limit', 10))
            if page > 0 and limit > 0:
                offset = (page - 1) * limit
                configs = configs[offset:offset + limit]
        except (ValueError, TypeError):
            # 处理页码或每页条数无效的情况，使用默认值
            pass

        # 转换为字典列表（便于视图层直接返回JSON）
        result = [
            {
                'id': config.id,
                'db_alias': config.db_alias,
                'db_type': config.db_type,
                'db_name': config.db_name,
                'host': config.host,
                'port': config.port or config.get_default_port(),  # 处理默认端口
                'organ_id': config.organ_id,
                'organ_name': config.organ_name,
                'is_active': config.is_active,
                'create_datetime': config.create_datetime.strftime('%Y-%m-%d %H:%M:%S'),
                'update_datetime': config.update_datetime.strftime('%Y-%m-%d %H:%M:%S'),
                'remark': config.remark or ''
            }
            for config in configs
        ]
        return result

    @staticmethod
    def get_database_configs_by_organ(organ_id):
        """
        扩展：按机构ID查询数据库配置（示例）

        参数：
            organ_id: 所属机构ID
        返回：
            list: 符合条件的配置列表
        """

        configs = DatabaseConfig.objects.filter(
            organ_id=organ_id,
            is_active=True  # 只查询启用状态的配置
        ).order_by('db_alias')

        # 同样转换为字典列表
        return [
            {
                'id': config.id,
                'db_alias': config.db_alias,
                'db_type': config.db_type,
                'organ_name': config.organ_name,
                'is_active': config.is_active
            }
            for config in configs
        ]

    @staticmethod
    def get_database_configs_by_token(organ_id, query_params):
        """
        按当前用户所属机构ID和查询参数过滤查询数据库配置

        参数：
            organ_id: 所属机构ID
            query_params: 查询参数字典
        返回：
            list: 符合条件的配置列表
        """
        # 基础查询：按机构ID和激活状态过滤
        configs = DatabaseConfig.objects.filter(
            organ_id=organ_id,
            is_active=True  # 只查询启用状态的配置
        ).order_by('db_alias')

        # 根据查询参数添加过滤条件
        # db_name过滤（模糊查询）
        if 'db_name' in query_params and query_params['db_name']:
            configs = configs.filter(db_name__icontains=query_params['db_name'])

        # db_alias过滤（模糊查询）
        if 'db_alias' in query_params and query_params['db_alias']:
            configs = configs.filter(db_alias__icontains=query_params['db_alias'])

        # host过滤（模糊查询）
        if 'host' in query_params and query_params['host']:
            configs = configs.filter(host__icontains=query_params['host'])

        # db_type过滤（精确匹配）
        if 'db_type' in query_params and query_params['db_type']:
            configs = configs.filter(db_type=query_params['db_type'])

        # 更新时间范围过滤
        if 'update_start_time' in query_params and query_params['update_start_time']:
            configs = configs.filter(update_datetime__gte=query_params['update_start_time'])

        if 'update_end_time' in query_params and query_params['update_end_time']:
            configs = configs.filter(update_datetime__lte=query_params['update_end_time'])

        # 分页处理
        try:
            page = int(query_params.get('page', 1))
            limit = int(query_params.get('limit', 10))
            if page > 0 and limit > 0:
                offset = (page - 1) * limit
                configs = configs[offset:offset + limit]
        except (ValueError, TypeError):
            # 处理页码或每页条数无效的情况，使用默认值
            pass

        # 转换为字典列表返回
        return [
            {
                'id': config.id,
                'db_alias': config.db_alias,
                'db_type': config.db_type,
                'db_name': config.db_name,
                'host': config.host,
                'port': config.port or config.get_default_port(),  # 处理默认端口
                'organ_id': config.organ_id,
                'organ_name': config.organ_name,
                'is_active': config.is_active,
                'create_datetime': config.create_datetime.strftime('%Y-%m-%d %H:%M:%S'),
                'update_datetime': config.update_datetime.strftime('%Y-%m-%d %H:%M:%S'),
                'remark': config.remark or ''
            }
            for config in configs
        ]

    @staticmethod
    def get_database_config_detail(config_id, organ_id=None):
        """
        获取数据库配置详情

        参数：
            config_id: 配置ID
            organ_id: 机构ID（可选，普通用户查询时传入，用于数据权限控制）
        返回：
            dict: 配置详情字典（不存在时返回None）
        """
        # 基础查询：按ID过滤
        query = DatabaseConfig.objects.filter(id=config_id)

        # 普通用户需额外过滤机构ID（数据权限控制）
        if organ_id:
            query = query.filter(organ_id=organ_id)

        # 获取单条记录
        config = query.first()
        if not config:
            return None

        # 返回完整字段（包含编辑所需的所有可修改项）
        return {
            # 基础信息字段
            'id': config.id,
            'description': config.description,
            'db_alias': config.db_alias,
            'db_name': config.db_name,
            'engine': config.engine,
            'db_type': config.db_type,

            # 连接信息字段
            'host': config.host,
            'port': config.port,
            'user': config.user,
            'password': config.password or '',  # 回显密码（实际场景可考虑部分隐藏）
            'options': config.options,
            'time_zone': config.time_zone,

            # 连接配置字段
            'autocommit': config.autocommit,
            'atomic_requests': config.atomic_requests,
            'conn_health_checks': config.conn_health_checks,
            'conn_max_age': config.conn_max_age,

            # 状态和备注字段
            'is_active': config.is_active,
            'remark': config.remark,

            # 机构相关字段（不可编辑，用于显示和权限控制）
            'organ_id': config.organ_id,
            'organ_name': config.organ_name,
            'dept_belong_id': config.dept_belong_id,

            # 审计跟踪字段（不可编辑，用于显示）
            'creator_id': config.creator_id,
            'modifier': config.modifier,
            'create_datetime': config.create_datetime.strftime(
                '%Y-%m-%d %H:%M:%S') if config.create_datetime else None,
            'update_datetime': config.update_datetime.strftime(
                '%Y-%m-%d %H:%M:%S') if config.update_datetime else None
        }

    @staticmethod
    def get_database_config_edit_data(config_id, organ_id=None):
        """
        获取编辑所需的配置数据（包含敏感信息如用户名，用于回显）

        参数：
            config_id: 配置ID
            organ_id: 机构ID（普通用户时传入，用于权限控制）
        返回：
            dict: 编辑用的数据字典（包含完整字段，包括用户密码）
        """
        query = DatabaseConfig.objects.filter(id=config_id)

        # 普通用户只能编辑本机构数据
        if organ_id:
            query = query.filter(organ_id=organ_id)

        config = query.first()
        if not config:
            return None

        # 返回完整字段（包含编辑所需的所有可修改项）
        return {
            # 基础信息字段
            'id': config.id,
            'description': config.description,
            'db_alias': config.db_alias,
            'db_name': config.db_name,
            'engine': config.engine,
            'db_type': config.db_type,

            # 连接信息字段
            'host': config.host,
            'port': config.port,
            'user': config.user,
            'password': config.password or '',  # 回显密码（实际场景可考虑部分隐藏）
            'options': config.options,
            'time_zone': config.time_zone,

            # 连接配置字段
            'autocommit': config.autocommit,
            'atomic_requests': config.atomic_requests,
            'conn_health_checks': config.conn_health_checks,
            'conn_max_age': config.conn_max_age,

            # 状态和备注字段
            'is_active': config.is_active,
            'remark': config.remark,

            # 机构相关字段（不可编辑，用于显示和权限控制）
            'organ_id': config.organ_id,
            'organ_name': config.organ_name,
            'dept_belong_id': config.dept_belong_id,

            # 审计跟踪字段（不可编辑，用于显示）
            'creator_id': config.creator_id,
            'modifier': config.modifier,
            'create_datetime': config.create_datetime.strftime('%Y-%m-%d %H:%M:%S') if config.create_datetime else None,
            'update_datetime': config.update_datetime.strftime('%Y-%m-%d %H:%M:%S') if config.update_datetime else None
        }

    @staticmethod
    def update_database_config(config_id, update_data, organ_id=None, modifier=None):
        """
        更新数据库配置

        参数：
            config_id: 配置ID
            update_data: 待更新的数据（序列化器验证后的数据）
            organ_id: 机构ID（普通用户时传入，用于权限校验）
            modifier: 修改人用户名
        返回：
            dict: 更新后的配置信息（或None表示失败）
        """
        # 构建查询（带权限过滤）
        query = DatabaseConfig.objects.filter(id=config_id)
        if organ_id:
            query = query.filter(organ_id=organ_id)

        # 获取要更新的对象
        config = query.first()
        if not config:
            return None

        # 更新字段
        for key, value in update_data.items():
            setattr(config, key, value)

        # 自动维护修改人和修改时间
        config.modifier = modifier or '未知用户'
        config.update_datetime = timezone.now()  # 需要导入from django.utils import timezone
        config.save()

        # 返回更新后的基本信息
        return {
            'id': config.id,
            'db_alias': config.db_alias,
            'db_name': config.db_name,
            'update_datetime': config.update_datetime.strftime('%Y-%m-%d %H:%M:%S'),
            'modifier': config.modifier
        }

    @staticmethod
    def create_database_config(data, organ_id, creator=None):
        """
        新增数据库配置

        参数：
            data: 验证后的配置数据
            organ_id: 所属机构ID
            creator: 创建人用户名
        返回：
            dict: 新增的配置信息
        """
        # 获取机构名称（如果你的系统有机构表，可在此查询）
        organ_name = ""
        # 示例：如果有机构模型，可通过organ_id查询名称
        # from .models import Department
        # dept = Department.objects.filter(id=organ_id).first()
        # organ_name = dept.name if dept else ""

        # 创建新配置
        new_config = DatabaseConfig.objects.create(
            **data,
            organ_id=organ_id,
            organ_name=organ_name,  # 存储机构名称（冗余字段，便于查询）
            creator=creator or '未知用户',
            create_datetime=timezone.now(),
            update_datetime=timezone.now()
        )

        # 返回新增的配置信息
        return {
            'id': new_config.id,
            'db_alias': new_config.db_alias,
            'db_name': new_config.db_name,
            'organ_id': new_config.organ_id,
            'organ_name': new_config.organ_name,
            'create_datetime': new_config.create_datetime.strftime('%Y-%m-%d %H:%M:%S'),
            'creator': new_config.creator
        }

    @staticmethod
    def delete_database_config(config_id, organ_id=None):
        """
        删除数据库配置

        参数：
            config_id: 配置ID
            organ_id: 机构ID（普通用户时传入，用于权限控制）
        返回：
            bool: 删除成功返回True，否则返回False
        """
        # 构建查询（带权限过滤）
        query = DatabaseConfig.objects.filter(id=config_id)
        if organ_id:
            query = query.filter(organ_id=organ_id)

        # 执行删除（返回受影响的行数）
        deleted_count, _ = query.delete()
        return deleted_count > 0
